import com.example.vo.Animal;
import com.example.vo.Cat;
import com.example.vo.Dog;
import com.example.vo.Feeder;

public class Main {
    public static void main(String[] args) {
        System.out.println("---------------animal---------------");
        Animal animal = new Animal("animal", 1);
        System.out.println("-------------cat-----------------");
        Cat cat = new Cat("cat", 3);
        System.out.println("--------------dog----------------");
        Dog dog = new Dog("dog", 2);
        System.out.println("------------------------------");

        System.out.println("\n");
        System.out.println("----------------Animal_dog--------------");
        Animal Animal_dog = new Dog("dog", 2);
        System.out.println("----------------Animal_cat--------------");
        Animal Animal_cat = new Cat("cat", 3);
        System.out.println("----------------Animal_feeder--------------");
        Animal Animal_feeder = new Feeder();
        System.out.println("------------------------------");
        System.out.println("\n");
//        当你执行Dog dog_animal = (Dog) new Animal();时，实际上会创建一个Animal类的实例，并将其强制转换为Dog类型。由于Animal类的实例并不是Dog类的实例，因此在运行时会抛出ClassCastException异常。
//// 向上转型
//        ParentClass parent = new ChildClass(); // 子类对象赋值给父类引用变量
//
//// 向下转型
//        ChildClass child = (ChildClass) parent; // 父类引用变量强制转换为子类对象



//        Dog dog_animal = (Dog) new Animal();
//        Cat cat_animal = (Cat) new Animal();
//        Feeder feeder_animal = (Feeder) new Animal();



//        向下转型时必须确保原始对象的实际类型是目标类型或其子类型
//这种转换只有在原始对象的实际类型是目标类型或其子类型时才能成功。
// 如果原始对象的实际类型是父类类型，那么向下转型将会失败。
//
//在你的例子中，尝试将Animal类的实例转换为Dog类的实例，但实际上创建的是Animal类的实例，
// 而不是Dog类的实例。因此，无法将Animal类的实例强制转换为Dog类的实例，这会导致ClassCastException异常。

/**
 * Animal Animal_dog = new Dog("dog", 2);
 * animal类没有的方法new的子类也没有
 * 以父类为模板 -> 父类所有方法调用，同时子类有相同的方法就覆盖
 * 子类方法中没有父类模板相同方法即无效
 * ->子类交集父类
 */

        Animal_dog.fly();
        System.out.println("\n");
        Animal_dog.eat();
        System.out.println("\n");
//        Animal_dog.lookDoor(); 没有这个方法


        Animal_cat.fly();
        System.out.println("\n");
        Animal_cat.eat();
        System.out.println("\n");

        Animal_feeder.feed();
        System.out.println("\n");
//注意这里的Animal_dog必须是dog的实例化即new dog
        System.out.println("----------------dog_animal--------------");
        Dog dog_animal = (Dog) Animal_dog;
        System.out.println("----------------cat_animal--------------");
        Cat cat_animal = (Cat) Animal_cat;
        System.out.println("-----------------feeder_animal-------------");
        Feeder feeder_animal = (Feeder) Animal_feeder;
        System.out.println("------------------------------");
        System.out.println("\n");
/**
 * Dog dog_animal = (Dog) Animal_dog;
 * 所有方法
 */
        dog_animal.fly();
        System.out.println("\n");
        dog_animal.eat();//不是dog的方法
        System.out.println("\n");
        dog_animal.lookDoor();
        System.out.println("\n");


        cat_animal.fly();
        System.out.println("\n");
        cat_animal.eat();
        System.out.println("\n");
        cat_animal.breath();//不是cat的
        System.out.println("\n");

        feeder_animal.feed();


    }
}

